import { h } from 'vue';
import VXETable from 'vxe-table';
import { definedComponent, addComponent, componentMap, spanEnds, excludeKeywords } from '../componentMap';
import { JVxeRenderType, JVxeTypePrefix, JVxeTypes } from '../types/JVxeTypes';
import { getEnhanced } from './enhancedUtils';
import { isFunction } from '/@/utils/is';
/**
 * 判断某个组件是否已注册
 * @param type
 */
export function isRegistered(type) {
    if (excludeKeywords.includes(type)) {
        return true;
    }
    return componentMap.has(type);
}
/**
 * 注册vxe自定义组件
 *
 * @param type
 * @param component 编辑状态显示的组件
 * @param spanComponent 非编辑状态显示的组件，可以为空
 */
export function registerComponent(type, component, spanComponent) {
    addComponent(type, component, spanComponent);
    registerOneComponent(type);
}
/**
 * 异步注册vxe自定义组件
 *
 * @param type
 * @param promise
 */
export async function registerAsyncComponent(type, promise) {
    const result = await promise;
    if (isFunction(result.installJVxe)) {
        result.install((component, spanComponent) => {
            addComponent(type, component, spanComponent);
            registerOneComponent(type);
        });
    }
    else {
        addComponent(type, result.default);
        registerOneComponent(type);
    }
}
/**
 * 安装所有vxe组件
 */
export function registerAllComponent() {
    definedComponent();
    // 遍历所有组件批量注册
    const components = [...componentMap.keys()];
    components.forEach((type) => {
        if (!type.endsWith(spanEnds)) {
            registerOneComponent(type);
        }
    });
}
/**
 * 注册单个vxe组件
 *
 * @param type 组件 type
 */
export function registerOneComponent(type) {
    const component = componentMap.get(type);
    if (component) {
        const switches = getEnhanced(type).switches;
        if (switches.editRender && !switches.visible) {
            createEditRender(type, component);
        }
        else {
            createCellRender(type, component);
        }
    }
    else {
        throw new Error(`【registerOneComponent】"${type}"不存在于componentMap中`);
    }
}
/** 注册可编辑组件 */
function createEditRender(type, component, spanComponent) {
    // 获取当前组件的增强
    const enhanced = getEnhanced(type);
    if (!spanComponent) {
        if (componentMap.has(type + spanEnds)) {
            spanComponent = componentMap.get(type + spanEnds);
        }
        else {
            // 默认的 span 组件为 normal
            spanComponent = componentMap.get(JVxeTypes.normal);
        }
    }
    // 添加渲染
    VXETable.renderer.add(JVxeTypePrefix + type, {
        // 可编辑模板
        renderEdit: createRender(type, component, JVxeRenderType.editer),
        // 显示模板
        renderCell: createRender(type, spanComponent, JVxeRenderType.spaner),
        // 增强注册
        ...enhanced.installOptions,
    });
}
/** 注册普通组件 */
function createCellRender(type, component = componentMap.get(JVxeTypes.normal)) {
    // 获取当前组件的增强
    const enhanced = getEnhanced(type);
    VXETable.renderer.add(JVxeTypePrefix + type, {
        // 默认显示模板
        renderDefault: createRender(type, component, JVxeRenderType.default),
        // 增强注册
        ...enhanced.installOptions,
    });
}
function createRender(type, component, renderType) {
    return function (renderOptions, params) {
        return [
            h(component, {
                type: type,
                params: params,
                renderOptions: renderOptions,
                renderType: renderType,
            }),
        ];
    };
}
